﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace SeizyUtils.AppCode.Common.Data.Csv
{
    /// <summary>
    /// CSVのエスケープを含めた書き込み、読込処理を実装します。
    /// </summary>
    public class CsvHelper
    {
        enum State
        {
            PARSE_COLUMN,

            DEFAULT
        }

        /// <summary>
        /// 一行のCsvレコードをエスケープ解除し、列に分解します。
        /// </summary>
        /// <param name="line"></param>
        /// <returns></returns>
        public static IList<string> splitCsvLine(string line)
        {

            IList<string> results = new List<string>();
            TextElementEnumerator reader = StringInfo.GetTextElementEnumerator(line);
            State state = State.DEFAULT;
            StringBuilder builder = new StringBuilder();
            string prev = null;
            while (reader.MoveNext())
            {
                String c = (String)reader.Current;
                if (state == State.DEFAULT)
                {
                    // 列解析開始
                    if ("\"".Equals(c))
                    {
                        prev = null;
                        state = State.PARSE_COLUMN;
                    }
                }
                else if (state == State.PARSE_COLUMN)
                {
                    // 列解析終了
                    if (!"\"".Equals(prev) && "\"".Equals(c))
                    {
                        if (prev != null)
                        {
                            builder.Append(prev);
                        }
                        results.Add(builder.ToString());
                        builder = new StringBuilder();
                        state = State.DEFAULT;
                    }
                    else if(prev != null) 
                    {
                        builder.Append(prev);
                    }
                    prev = c;
                }
            }
            return results;
        }

        /// <summary>
        /// valueをダブルクォーテーションで囲います。
        /// value中のダブルクォーテーションは""とします。
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string escapeQuato(string value)
        {
            if (value == null)
            {
                return "\"\"";
            }
            string replaced = value.Replace("\"", "\"\"");
            return "\""+replaced+"\"";

        }


    }
}
